Reproduzierbare Forschung
mit R und Quarto – Einleitung

Workshop für die GSE Wuppertal

Björn S. Siepe

June 27, 2025

Einstieg

Plan für Heute

  1. Einleitung
    • Was ist Reproduzierbarkeit?
    • Einfache Strategien (“Easy Wins”)
    • Einführung in dynamische Berichte
  2. Praktischer Teil
    • Erstellung dynamischer Berichte mit Quarto
    • Typische Herausforderungen und Lösungen
  3. Fortgeschrittene Themen
    • Nächste Schritte für mehr Reproduzierbarkeit
    • Tools und Best Practices
  4. Zusammenfassung & Abschlussdiskussion
    • Was haben wir gelernt?
    • Offene Fragen & Ausblick

Sehr grober Zeitplan

Uhrzeit Programmpunkt
10:00 – 10:15 Begrüßung & Einführung
10:15 – 11:15 Einleitung
11:15 – 11:20 ☕ Kurze Pause
11:20 – 12:30 Praktischer Teil 1
12:30 – 13:15 🍽️ Mittagspause
13:15 – 14:20 Praktischer Teil 2
14:20 – 14:30 ☕ Kurze Pause
14:30 – 15:30 Fortgeschrittene Themen
15:30 – 16:00 Zusammenfassung & Abschlussdiskussion

Vorabinformation

Teile dieses Workshops beruhen teils verbatim oder sehr nah auf folgenden Ressourcen, welche ich mit einer CC-BY Lizenz verwende: - CRS Primer on dynamic reporting - Molo, Fraga González, and Pawel (2025) - Peikert and Diemerling (2025) - Teils recht opinionated

TODO Link zu Materialien nochmals.

Computational reproducibility

Eine sehr einfache Definition:

Die gleiche Analyse der gleichen Daten führt zu den gleichen Ergebnissen

 

The Turing Way Community and Scriberia (2024)

Example

  • Es wurde versucht, 22.578 Jupyter-Notebooks, die mit 3.467 Publikationen aus PubMed verknüpft sind, erneut auszuführen.
  • Für 10.388 dieser Notebooks konnten alle angegebenen Abhängigkeiten erfolgreich installiert werden
  • 1.203 Notebooks liefen ohne Fehler durch
  • 879 Notebooks (4 %) lieferten Ergebnisse, die mit denen des Originals identisch waren

\(\rightarrow\) Computational reproducibility kann schwierig sein!

Terminologie


The Turing Way Community (2022)

Computational Reproducibility

Molo, Fraga González, and Pawel (2025)

From Molo, Fraga González, and Pawel (2025), inspired by Peng (2011) and Peikert and Brandmaier (2021)

Replicability: Beispiel

Open Science Collaboration (2015)

Robustness: Beispiel

Gould et al. (2023)

Generalizability


The Turing Way Community and Scriberia (2024)

\(\rightarrow\) Reproducibility + Robustness + Replicability necessary for Generalizabilty!

Jeder Schritt zählt

Aber reproduzierbare Forschung ist schwierig und kann sich überwältigend anfühlen.

Kein Grund zur Verzweiflung! Mit jedem Schrit::

  • seid Ihr einen Schritt näher an reproduzierbarer Forschung
  • verbessert Ihr die Qualität eurer Forschung und erleichtert euer Leben
  • lernt Ihr breit anwendbare technische Skills

Easy Wins

Projektstruktur

Vorher: Chaos 📁

-   Paper_final_wirklich_final.docx 
-   daten.xlsx code_alt.R 
-   code_neu_funktioniert.R 
-   plot1.png 

Nachher: Ordnung ✨

projekt/
├── data/
│   ├── raw/
│   └── processed/
├── scripts/
├── output/
└── README.md

Praxis-Tipp

Erstellt eine Standard-Ordnerstruktur und kopiert diese für neue Projekte!

Dateinamen

❌ Problematisch

  • Daten.xlsx
  • neue analyse.R
  • plot final FINAL.png
  • Fragebogen - Kopie (2).docx

✅ Besser

  • 2025-06-28_fragebogen-daten-roh.xlsx
  • 01_datenbereinigung.R
  • 02_deskriptive-statistik.R
  • abb01_altersverteilung.png

Code-Dokumentation

❌ Unzureichend:

Unklarer Name, keine Dokumentation:

logmlis <- function(x){
  lapply(x, function(x){
   y <- unlist(x)
   y <- y[!is.na(y)]
   y <- y[y != ""]
   return(mean(log(y)))
  })
}

✅ Besser:

Klarer Name, konzise Dokumentation:

log_mean_list <- function(x) {
  # Calculates the logarithmic mean of a list of numerical values
  # Removes NA and empty values before the calculation
  y <- unlist(x)  
  y <- y[!is.na(y)]  
  y <- y[y != ""]  
  return(mean(log(y)))  
}

Code-Dokumentation

  • Viele unterschiedliche Meinungen
  • In der Wissenschaft: Lieber etwas zu viel als zu wenig

Praxis-Tipp

Nach Peikert and Diemerling (2025):

  1. Was standardisiert ist, muss nicht dokumentiert werden.
  2. Was einfach ist, braucht nur wenig Dokumentation.
  3. Was konsistent ist, muss nur einmal dokumentiert werden.

Dateipfade

❌ Absoluter Pfad (schlecht):

daten <- read.csv("C:/Users/Maria/Desktop/Masterarbeit/daten.csv") 

Problem: Funktioniert nur auf Ihrem Computer!

✅ Relativer Pfad (gut):

daten <- read.csv("data/raw/fragebogen-daten.csv") 

Noch besser: Verwendung des here packages (funktioniert mit verschiedenen Systemen):

library(here)
daten <- read.csv(here("data", "raw", "fragebogen-daten.csv"))

Aufteilung in verschiedene Skripte

❌ Ein großes Skript:

# complete_analysis.R (500+ lines)
# Data import, cleaning, analysis, plots, export...

✅ Modulare Aufteilung:

  • 01_data_import.R - Rohdaten laden
  • 02_data_cleaning.R - Präprozessierung
  • 03_descriptive_analysis.R - Deskriptive Statistiken
  • 04_inferential_statistics.R - Inferenz
  • 05_visualization.R - Abbildungen
  • 06_export.R - Export

Vorteile: Übersichtlicher, leichter zu debuggen, bessere Zusammenarbeit

Funktionsbasiertes Programmieren

❌ Code-Wiederholung:

# Standardization for variable 1
data$var1_std <- (data$var1 - mean(data$var1, na.rm = TRUE)) / 
                 sd(data$var1, na.rm = TRUE)

# Standardization for variable 2  
data$var2_std <- (data$var2 - mean(data$var2, na.rm = TRUE)) / 
                 sd(data$var2, na.rm = TRUE)

# Standardization for variable 3...

✅ Funktion erstellen:

standardize_variable <- function(x) {
  # Z-standardization of a numeric variable
  (x - mean(x, na.rm = TRUE)) / sd(x, na.rm = TRUE)
}

# Application
data$var1_std <- standardize_variable(data$var1)
data$var2_std <- standardize_variable(data$var2)
data$var3_std <- standardize_variable(data$var3)

# Or even better
data <- data |>
  mutate(across(starts_with("var"), standardize_variable))

Vermeiden von “magic numbers”

❌ Unklare Zahlen im Code:

# What do these numbers mean?
clean_data <- data[data$age >= 18 & data$age <= 65, ]
final_data <- clean_data[clean_data$score > 2.5, ]
significant <- results[results$p_value < 0.05, ]

✅ Benannte Konstanten:

# Clear definitions at the beginning of the script
MIN_AGE <- 18
MAX_AGE <- 65
MIN_SCORE <- 2.5
ALPHA_LEVEL <- 0.05

# Usage in code
clean_data <- data[data$age >= MIN_AGE & 
                   data$age <= MAX_AGE, ]
final_data <- clean_data[clean_data$score > MIN_SCORE, ]
significant <- results[results$p_value < ALPHA_LEVEL, ]

Vorteil: Code wird selbsterklärend und leichter anpassbar

Session Info

Warum wichtig?

  • Reproduzierbarkeit: Welche R-Version und Pakete wurden verwendet?
  • Fehlerdiagnose: Unterschiedliche Paketversionen können verschiedene Ergebnisse liefern
  • Dokumentation: Vollständige Nachvollziehbarkeit der Analyse

✅ Am Ende jedes Skripts:

# Session information for reproducibility
sessionInfo()

Praxis-Tipp

Entwedern in Quarto direkt rendern oder in separatem File speichern:

writeLines(capture.output(sessionInfo()), "session_info.txt")

Dynamische Reports

Typischer, nicht-dynamischer Workflow

Molo, Fraga González, and Pawel (2025)

Typische Probleme

Molo, Fraga González, and Pawel (2025)
  • unklarer Ausführungsreihenfolge

  • Zeitaufwendiges Copy-Pasten

  • Fehleranfälliges Copy-Pasten

Dynamische Reports: Das Ziel

Daten \(\rightarrow\) dynamischer Report \(\rightarrow\) Manuskript

Ein Workflow für dynamische Reports

Molo, Fraga González, and Pawel (2025)

Komponenten eines dynamischen Reports

Molo, Fraga González, and Pawel (2025)

TODO Quelle einfügen

Text: Typische Markup-Sprachen

Molo, Fraga González, and Pawel (2025)

Manche Implementierungen



Datei Code Markup Output Formate
Sweave .Rnw R LaTeX pdf, tex
R Markdown .Rmd R Markdown pdf, html, tex, docx, pptx
Jupyter Notebook .ipynb Julia, Python, R Markdown pdf, html, tex, py, …
Quarto .qmd Julia, Python, R Markdown pdf, html, tex, docx, pptx, …

Warum Quarto?

  • open source
  • modern, wird kontinuierlich weiterentwickelt
  • einfache Handhabung
  • Mehrere Programmiersprachen (z.B. R, Python, Julia)
  • vielfältige Editoren/IDEs (z. B. RStudio, VS Code)
  • allgemeines wissenschaftliches Publikationssystem (z. B. Artikel, Folien, Websites)

Quarto in RStudio

Molo, Fraga González, and Pawel (2025)

Quarto in RStudio: PDF Output

Molo, Fraga González, and Pawel (2025)

Quarto in RStudio: MS Word output

Molo, Fraga González, and Pawel (2025)

Weitere Literatur

Literatur

Gould, Elliot, Hannah S. Fraser, Timothy H. Parker, Shinichi Nakagawa, Simon C. Griffith, Peter A. Vesk, Fiona Fidler, et al. 2023. “Same Data, Different Analysts: Variation in Effect Sizes Due to Analytical Decisions in Ecology and Evolutionary Biology,” October. https://ecoevorxiv.org/repository/view/6000/.
Molo, Fabio, Gorka Fraga González, and Samuel Pawel. 2025. “Workshop ‘Reproducible and Dynamic Reporting with r and Quarto – Getting Started’ at UZH.” https://doi.org/doi.org/10.5281/zenodo.14169002.
Open Science Collaboration. 2015. “Estimating the Reproducibility of Psychological Science.” Science 349 (6251): aac4716. https://doi.org/10.1126/science.aac4716.
Peikert, Aaron, and Andreas M. Brandmaier. 2021. “A Reproducible Data Analysis Workflow with r Markdown, Git, Make, and Docker.” Quantitative and Computational Methods in Behavioral Sciences 1. https://doi.org/10.5964/qcmb.3763.
Peikert, Aaron, and Hannes Diemerling. 2025. “Reproducible Research in r: A Workshop on How to Do the Same Thing More Than Once.” Zenodo. https://doi.org/10.5281/zenodo.15038481.
Peng, Roger D. 2011. “Reproducible Research in Computational Science.” Science 334 (6060): 1226–27. https://doi.org/10.1126/science.1213847.
The Turing Way Community. 2022. The Turing Way: A Handbook for Reproducible, Ethical and Collaborative Research (1.0.2). Zenodo. https://doi.org/10.5281/ZENODO.3233853.
The Turing Way Community, and Scriberia. 2024. “Illustrations from the Turing Way: Shared Under CC-BY 4.0 for Reuse.” Zenodo. https://doi.org/10.5281/ZENODO.3332807.